﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Web.UI;
using KeyCore.Loans.Client.Web.Models.Account;

namespace KeyCore.Loans.Client.Web.Controllers
{
    public class AccountController : Controller
    {



        public ActionResult Login()
        {
            if (User.Identity.IsAuthenticated) return RedirectToAction("Index", "Home");

            return View();
        }


        [HttpPost]
        [AllowAnonymous]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (User.Identity.IsAuthenticated) return RedirectToAction("Index", "Home");

            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    // nie trzeba zmnieniac lastlogindate bo robie to w validateuser
                    //var mi = Membership.GetUser(model.UserName);
                    //mi.LastLoginDate = DateTime.Now;
                   // unitOfWork.UsersRepository.SetLastLoginDate(model.UserName);

                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Nazwa użytkownika lub hasło są nieprawidłowe.");
                    // zeruj haslo 
                    model.Password = String.Empty;
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        [HttpPost]
        [Authorize]
        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Index", "Home");
        }

        public ActionResult Register()
        {
            if (User.Identity.IsAuthenticated) return RedirectToAction("Index", "Home");

            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        public ActionResult Register(RegisterModel model)
        {
            if (User.Identity.IsAuthenticated) return RedirectToAction("Index", "Home");

            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus;
                Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

                if (createStatus == MembershipCreateStatus.Success)
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, false); // createPersistentCookie
                    //return RedirectToAction("Index", "Home");
                    // return RegistrationConfirmation("RegistrationConfirmation");

                    return RedirectToAction("RegistrationConfirmation", new { userName = model.UserName });
                }
                else
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        [Authorize]
        public ActionResult RegistrationConfirmation()
        {
            if (User.Identity.IsAuthenticated) return RedirectToAction("Index", "Home");

            return View();
        }

        [HttpGet]
        [Authorize]
        public ActionResult RegistrationConfirmation(string userName)
        {

            if (User.Identity.IsAuthenticated) return RedirectToAction("Index", "Home");
            
            // przypatrzyc sie tej skladni dokladnie - castowanie na getusersbyemail
            var modelcollection = Membership
                .GetAllUsers()
                .Cast<MembershipUser>()
                .Select(x => new RegisterViewModel
                {
                    UserName = x.UserName,
                    Email = x.Email,
                 //   Role = Roles.GetRolesForUser(x.UserName) //not needed deleted commented from viewmodel
                });

            var model = modelcollection.SingleOrDefault(n => n.UserName == userName);
        
            return View(model);
        }

        #region Status Codes
        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // See http://go.microsoft.com/fwlink/?LinkID=177550 for
            // a full list of status codes.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "Użytkownik o takiej nazwie już istnieje, proszę wprowadzić inną nazwę.";

                case MembershipCreateStatus.DuplicateEmail:
                    return "Użytkownik z takim adresem email już istnieje, proszę wprowadzić inny adres email.";

                case MembershipCreateStatus.InvalidPassword:
                    return "Wprowadzone hasło jest nieprawidłowe, proszę je poprawić.";

                case MembershipCreateStatus.InvalidEmail:
                    return "Wprowadzony adres email jest nieprawidłowy, proszę go poprawić.";

                case MembershipCreateStatus.InvalidAnswer:
                    return "Odpowiedź odzyskiwania hasła jest nieprawidłowa, proszę ją poprawić.";

                case MembershipCreateStatus.InvalidQuestion:
                    return "Pytanie odzyskiwania hasła jest nieprawidłowe, proszę je poprawić.";

                case MembershipCreateStatus.InvalidUserName:
                    return "Nazwa użytkownika jest nieprawidłowa, proszę ją poprawić.";

                case MembershipCreateStatus.ProviderError:
                    return "Podczas uwierzytelnienia wystąpił błąd, proszę spróbować ponownie.";

                case MembershipCreateStatus.UserRejected:
                    return "Podczas zakładania konta wystąpił błąd, proszę spróbować ponownie.";

                default:
                    return "Wystąpił nieznany błąd, proszę spróbować ponownie.";
            }
        }
        #endregion


    }
}
